﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Drawing;
using System.Windows.Forms;

namespace LanCommunity
{
    /// <summary>
    /// Klasa odpowiadająca za konfigurację programu
    /// </summary>
    internal static class Config
    {
        /// <summary>
        /// Informacje o urządzeniu (adres IP, opis)
        /// </summary>
        public class DeviceInfo
        {
            /// <summary>
            /// Host - Adres
            /// </summary>
            public string Host
            {
                get;
                private set;
            }

            /// <summary>
            /// Opis urządzenia
            /// </summary>
            public string Description
            {
                get;
                private set;
            }

            /// <summary>
            /// Konstruktor
            /// </summary>
            /// <param name="host">host</param>
            /// <param name="description">opis</param>
            public DeviceInfo(string host, string description)
            {
                this.Host = host;
                this.Description = description;
            }
        }

        /// <summary>
        /// Rozmiar i pozycja okna
        /// </summary>
        public static Rectangle Bounds
        {
            get;
            set;
        }

        /// <summary>
        /// Lista urządzeń
        /// </summary>
        public static List<DeviceInfo> Devices
        {
            get;
            set;
        }

        /// <summary>
        /// Statyczny konstruktor
        /// </summary>
        static Config()
        {
            //Inicjalizacja zmiennych
            Config.Devices = new List<DeviceInfo>();
            Config.Bounds = new Rectangle();
        }

        /// <summary>
        /// Wczytuje konfigurację z pliku
        /// </summary>
        public static void LoadConfig()
        {
            string configFilePath = "config.xml";
            if (!File.Exists(configFilePath))
            {
                //stwórz plik konfiguracyjny
                SaveConfig();
            }

            Stream configStream = null;
            XmlTextReader config = null;
            try
            {
                configStream = new FileStream(configFilePath, FileMode.Open);
                config = new XmlTextReader(configStream);

                //konfiguracja
                config.ReadStartElement("Config");
                {
                    //ustawienia okna
                    config.ReadStartElement("WindowSettings");
                    {
                        Bounds = new Rectangle(
                            Int32.Parse(config.ReadElementString("PositionX")),
                            Int32.Parse(config.ReadElementString("PositionY")),
                            Int32.Parse(config.ReadElementString("Width")),
                            Int32.Parse(config.ReadElementString("Height")));
                    }
                    config.ReadEndElement();

                    //lista urządzeń
                    config.ReadStartElement("Devices");
                    {
                        while (config.ReadToNextSibling("Device"))
                        {
                            config.ReadStartElement("Device");
                            {
                                string ip = config.ReadElementString("Host");
                                string desc = config.ReadElementString("Description");
                                if (!string.IsNullOrEmpty(ip))
                                {
                                    Devices.Add(new DeviceInfo(ip, desc));
                                }
                            }
                            config.ReadEndElement();
                        }
                    }
                    config.ReadEndElement();
                }
                config.ReadEndElement();
            }
            catch (Exception)
            {
                //obsługa wyjątku
            }
            finally
            {
                config.Close();
                configStream.Close();
            }
        }

        /// <summary>
        /// Zapisuje konfigurację aplikacji do pliku
        /// </summary>
        public static void SaveConfig()
        {
            string configFilePath = "config.xml";

            Stream configStream = null;
            XmlTextWriter config = null;
            try
            {
                configStream = new FileStream(configFilePath, FileMode.Create);
                config = new XmlTextWriter(configStream, Encoding.Unicode);
                config.Formatting = Formatting.Indented; //formatowanie

                config.WriteStartDocument();
                {
                    //konfiguracja
                    config.WriteStartElement("Config");
                    {
                        //ustawienia okna
                        config.WriteStartElement("WindowSettings");
                        {
                            config.WriteElementString("PositionX", Bounds.Location.X.ToString());
                            config.WriteElementString("PositionY", Bounds.Location.Y.ToString());
                            config.WriteElementString("Width", Bounds.Width.ToString());
                            config.WriteElementString("Height", Bounds.Height.ToString());
                        }
                        config.WriteEndElement();

                        //lista urządzeń
                        config.WriteStartElement("Devices");
                        {
                            foreach (DeviceInfo deviceInfo in Devices)
                            {
                                config.WriteStartElement("Device");
                                {
                                    config.WriteElementString("Host", deviceInfo.Host);
                                    config.WriteElementString("Description", deviceInfo.Description);
                                }
                                config.WriteEndElement();
                            }
                        }
                        config.WriteEndElement();
                    }
                    config.WriteEndElement();
                }
                config.WriteEndDocument();
            }
            catch (Exception)
            {
                //obsługa wyjątku
            }
            finally
            {
                config.Close();
                configStream.Close();
            }
        }

        public static void ApplySettings(Form activeForm)
        {
            
        }
    }
}
